
package com.scott.itcast.thread.lesson16;

/**
 * 多线程共享数据 设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。写出程序
 * 方法4-3 线程共享数据 设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。写出程序
 * 如果每个线程的执行代码不同,这时候需要不同的Runnable对象(比如例子中的runnableA和runnableB)
 * 将这些Runnable对象(比如例子中的runnableA和runnableB)作为某1个类(MultiThreadShareData)的内部类
 * 共享数据(ShareData)作为类的成员变量: private static  ShareData share = new ShareData();
 * 然后在构造方法中得到公用的ShareData对象  实现内部类之间共享数据
 * 每个线程对共享数据的操作方法也写在外部类MultiThreadShareData中。以实现对共享数据进行各种操作的互斥和通信。
 * 作为内部类的各Runnable对象(比如例子中的runnableA和runnableB)调用外部类的这些方法(增加方法inc和减少方法dec)
 * 
 * 
 */
public class MultiThreadShareData {
	private static  ShareData share = new ShareData();
	
	//增加
	public static synchronized void inc() {
		for(int i =0; i<100;i++){
			ShareData.j++;
			System.out.println(Thread.currentThread().getName() + "-inc增加:" + ShareData.j);
		}
	}
	
	//减少
	public static synchronized void dec() {
		for(int i =0;i<100;i++){
			ShareData.j--;
			System.out.println(Thread.currentThread().getName() + "-dec减少:" + ShareData.j);
		}
	}
		
	public static void main(String args[]) {
		
		//final ShareData share = new ShareData();
		
		//在线程A中要做的事情
		RunnableA runnableA = new RunnableA(share);
		
		//在线程B中要做的事情
		RunnableB runnableB = new RunnableB(share);
		
		
		for (int i = 0; i < 2; i++) {
			//启动线程A  把runnableA交给线程去运行
			new Thread(runnableA).start();
			
			//启动线程B 把runnableB交给线程去运行
			new Thread(runnableB).start();
		}
	}
	
	
	
}

class RunnableA implements Runnable{

	@SuppressWarnings("unused")
	private ShareData share;
	public RunnableA(ShareData share){
		this.share =share;
	}
	
	//增加
	public void run() {
		MultiThreadShareData.inc();
	}
	
}

class RunnableB implements Runnable{

	@SuppressWarnings("unused")
	private ShareData share;
	public RunnableB(ShareData share){
		this.share =share;
	}
	
	//减少
	public void run() {
		MultiThreadShareData.dec();
	}
	
}


//共享的数据
class ShareData{
	static int j =0;
	
}
